package collection_test.queue.blcok_queue;

import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TransferQueue;

/**
 * TransferQueue 的独特之处在于 transfer方法，不论队列满没满， 每放入一个元素的时候就会进入阻塞状态，需要等待该元素被消费了的时候才能停止阻塞。
 */
public class TransferQueueTest {
    public static void main(String[] args) throws InterruptedException {
        TransferQueue transferQueue = new LinkedTransferQueue();
        transferQueue.put("a");
        transferQueue.put("b");
        transferQueue.put("c");
        new Thread(() -> {
            try {
                System.out.println("首先消费前三个元素。。。");
                transferQueue.take();
                transferQueue.take();
                transferQueue.take();
                System.out.println("5秒后消费队列元素。。");
                TimeUnit.SECONDS.sleep(5);
                transferQueue.take();
                System.out.println("消费了队列元素。。");
                System.out.println("5秒后消费队列元素。。");
                TimeUnit.SECONDS.sleep(5);
                transferQueue.take();
                System.out.println("消费了队列元素。。");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        new Thread(() -> {
            try {
                transferQueue.transfer("bcd");//相当于put的操作，但是和put不同的是，它需要等待消费者消费了这个元素之后，才会停止阻塞，而不是像put一样，放完就继续向下走
                System.out.println("bcd 完成");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        transferQueue.transfer("abc");//相当于put的操作，但是和put不同的是，它需要等待消费者消费了这个元素之后，才会停止阻塞，而不是像put一样，放完就继续向下走
        System.out.println("abc 完成");

    }
}
